/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import Negocio.Cola.Cola;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Ivan
 */
public class PrimeroEnProfundidadDer extends MetodoBusqueda {

    private Cola<Hoja> abierto;
    private Hoja m;


    public PrimeroEnProfundidadDer() {
        abierto = new Cola<Hoja>();
        m = null;
    }

    @Override
    public List<Estado> obtenerOptimo() {
        List<Estado> optimo=new ArrayList<Estado>();
        List<Hoja> camino=arbol.getCaminoOptimo();

        for(int i=0; i<camino.size();i++){
            optimo.add(camino.get(i).getEstado());
        }
        return optimo;
    }
    
    public void procesar() {
        iniciarArbol();        
        ArrayList<Hoja> pila=new ArrayList<Hoja>(100);       
        Hoja actual=arbol.getRaiz();    
        
        while(actual.esEstadoFinal()==false)
        {
            arbol.cargarHijosDinamico(actual);            
            for(Hoja h:actual.getHijos())
                pila.add(0,h);
            actual=pila.remove(0);
        }
        
        ArrayList<Hoja> optimo=new ArrayList<Hoja>(0);
        while(actual!=null)
        {
            actual.setEsCamino(true);
            optimo.add(0,actual);
            actual=actual.getPadre();
        }
        arbol.setCaminoOptimo(optimo);
    }

    
    public void procesar2() {
//        cargarArbol(7);
        iniciarArbol();
        Hoja raiz = arbol.getRaiz();
       
        List<Hoja> optimo = new ArrayList<Hoja>();
        abierto.limpiar();
        abierto.insertar(raiz);
        raiz.setEsProcesadoProfundidad(true);
        do{
            try {
//                m = abierto.eliminarUltimo();
                m=abierto.eliminar();
                m.setEsCamino(true);
                optimo.add(m);
            } catch (Exception ex) { }

        arbol.cargarHijosDinamico(m);
            List<Hoja> hijos = m.getHijos();

            for(int i=hijos.size() ; i == 0 ; i--){
                if(hijos.size() > 0){
                   if(!hijos.get(i).isEsProcesadoProfundidad())
                   {
                       abierto.insertarPrimero(hijos.get(i-1));
                        hijos.get(i).setEsProcesadoProfundidad(true);
                    }
                }
            }
        

        }while(!m.esEstadoFinal() );
        arbol.setCaminoOptimo(optimo);
    }

  
    @Override
    public String toString() {
        return "Primero en Profundidad Der";
    }


}